package com.chanzany.interview_secondary.jvm.jvm_03_fourReference;

import java.lang.ref.Reference;
import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;
import java.util.HashMap;
import java.util.WeakHashMap;

/**
 四大引用类型
 1. 强引用
 常规定义的引用类型
 Integer a = new Integer(1);
 不论多少次GC都不会销毁的引用
 2. 弱引用 --WeakHashMap
 Object o1 = new Object();
 WeakReference<Object> weakReference = new WeakReference<>(o1);
 每次GC都会被销毁
 3. 软引用
 Reference<Object> softReference = new SoftReference<>(o2);
 当内存充足时它不会被回收，反之，内存不足时它会被回收
 4. 虚引用(java.lang.ref.PhantomReference)
 形同虚设，与其他几种引用都不同，虚引用并不会决定对象的生命周期。
 如果一个对象仅持有虚引用，那么它就和没有任何引用一样，在任何时候都可能被垃圾回收器回收，它不能单独使用也不能
 通过它访问对象，虚引用必须和引用队列(ReferenceQueue)联合使用。
 虚引用的主要作用是跟踪对象被垃圾回收的状态。仅仅是提供一种确保对象被finalize以后，做某些事情的机制。
 PhantomReference的get方法总是返回Null,因此无法访问对应的引用对象。其意义在于说明一个对象已经进入
 finalization阶段，可以被gc回收，用来实现比finalization机制更灵活的回收操作。

 */
public class FourReferenceDemo {
    public static void main(String[] args) {
//        weakReference();
//        softReference();
        weakHashMapTest();
    }

    public static void weakReference() {
        Object o1 = new Object();
        WeakReference<Object> weakReference = new WeakReference<>(o1);
        System.out.println(o1);
        System.out.println(weakReference.get());
        o1 = null;
        System.gc();
        System.out.println(o1);
        System.out.println(weakReference.get());
    }
    public static void softReference(){
        Object o2 = new Object();
        Reference<Object> softReference = new SoftReference<>(o2);
        System.out.println(o2);
        System.out.println(softReference.get());
        o2 = null;
        System.gc();
        
        try {
            byte[] bytes = new byte[1024 * 1024 * 50];
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            System.out.println(o2);
            System.out.println(softReference.get());
        }
    }

    public static void weakHashMapTest(){
        WeakHashMap<Integer, String> weakHashMap = new WeakHashMap<>();
        Integer key = new Integer(2);
        String value = "WeakHashMap";
        weakHashMap.put(key,value);
        System.out.println(weakHashMap);
        key=null;
        System.gc();
        System.out.println(weakHashMap);

    }
}
